const express = require('express');
const schedule = require('node-schedule');
const moment = require('moment-timezone');
const cors = require('cors');
const path = require('path');
const dotenv = require('dotenv');
const db = require('./db');

// 加载环境变量
dotenv.config();

const app = express();
const PORT = process.env.PORT || 5000;

// 定时任务调度器 - 每分钟检查一次
const job = schedule.scheduleJob('* * * * *', async () => {
  const now = moment.tz('Asia/Shanghai').toDate();
  const currentTime = moment.tz('Asia/Shanghai').format('YYYY-MM-DDTHH:mm:ss.SSSZ');

  // 查询需要执行的定时任务（只查询定时任务模板，不包括已生成的实例）
  db.all(
    `SELECT * FROM notifications
     WHERE next_run_time <= ? AND recurrence_type IS NOT NULL AND is_read = 0`,
    [currentTime],
    (err, tasks) => {
      if (err) {
        console.error('查询定时任务失败:', err.message);
        return;
      }

      tasks.forEach(task => {
        // 创建新通知实例（不包含定时任务属性，避免被重复查询）
        const newNotificationSql = `INSERT INTO notifications (
          title, content, sender_id, recipient_id, is_read, created_at
        ) VALUES (?, ?, ?, ?, ?, ?)`;

        // 计算下次运行时间
        // 使用moment-timezone解析为GMT+8时间并计算下次运行时间
        let nextRunTime = moment.tz(task.next_run_time, 'Asia/Shanghai');
        switch (task.recurrence_type) {
          case 'month':
            nextRunTime.add(task.recurrence_interval, 'months');
            break;
          case 'week':
            nextRunTime.add(task.recurrence_interval * 7, 'days');
            break;
          case 'day':
            nextRunTime.add(task.recurrence_interval, 'days');
            break;
          default:
            console.error('未知的定时类型:', task.recurrence_type);
            return;
        }

        // 插入新通知实例（普通通知，不包含定时任务属性）
        db.run(
          newNotificationSql,
          [
            task.title, task.content, task.sender_id, task.recipient_id, false,
            moment.tz('Asia/Shanghai').toISOString()
          ],
          function(err) {
            if (err) {
              console.error('创建定时通知失败:', err.message);
              return;
            }
            console.log(`已创建定时通知实例 #${this.lastID}`);
          }
        );

        // 更新定时任务模板的下次运行时间
        db.run(
          `UPDATE notifications SET next_run_time = ? WHERE id = ?`,
          [nextRunTime.toISOString(), task.id],
          (err) => {
            if (err) {
              console.error('更新定时任务下次运行时间失败:', err.message);
            } else {
              console.log(`已更新定时任务 #${task.id} 的下次运行时间为: ${nextRunTime.format('YYYY-MM-DD HH:mm:ss')}`);
            }
          }
        );
      });
    }
  );
});

// 中间件
app.use(cors());
app.use(express.json());

// SQLite数据库连接已在db.js中初始化

// 路由
app.use('/api/auth', require('./routes/auth'));
app.use('/api/users', require('./routes/users'));
app.use('/api/notifications', require('./routes/notifications'));

// 生产环境静态文件服务
if (process.env.NODE_ENV === 'production') {
  app.use(express.static(path.join(__dirname, '../client/build')));
  app.get('*', (req, res) => {
    res.sendFile(path.join(__dirname, '../client/build/index.html'));
  });
}

// 错误处理中间件
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).send({ message: '服务器内部错误', error: err.message });
});

app.listen(PORT, () => {
  console.log(`服务器运行在端口 ${PORT}`);
});

module.exports = app;